//加载模块

var express = require('express')
//处理post请求的参数到body对象
var bodyParser = require('body-parser')
//处理文件
var fs = require('fs')
//处理文件上传和下载
var multer = require('multer')
//处理cookie
var cookieParser = require('cookie-parser')

//创建服务器
var app = express()

//配置静态文件夹
app.use(express.static('www'))
//解析cookie对象
app.use(cookieParser())
//解析post请求
app.use(bodyParser.urlencoded({ extended: true }));

/*-----------------------注册的接口-------------------------------------*/
app.post('/user/register', function(req, res) {

	//判断有没有user这个文件夹
	fs.exists('users', function(exist) {
		if(exist) {
			//存在，我们写入数据
			writeFile()
		} else {
			//不存在，我们创建在写入数据
			fs.mkdirSync('users', function(err) {
				if(err) {
					//创建文件夹失败
					res.status(200).json({
						code: 0,
						message: '系统创建文件夹失败'
					})
				} else {
					//创建文件夹成功，写入数据
					writeFile()
				}
			})

		}

	})

	//封装一个，将用户信息写入本地的方法
	function writeFile() {
		//判断用户是否已经注册过
		var fileName = 'users/' + req.body.petname + '.txt'
		fs.exists(fileName, function(exi) {
			if(exi) {
				//用户存在，已被注册
				res.status(200).json({
					code: 1,
					message: '用户已存在，重新注册'
				})
			} else {
				//可以注册
				//在boby加入IP和time
				req.body.ip = req.ip
				req.body.time = new Date()
				//未注册时把用户信息写入到本地
				fs.writeFile(fileName, JSON.stringify(req.body), function(err) {
					if(err) {
						//写入失败
						res.status(200).json({
							code: 2,
							message: '写入失败，重新注册'
						})
					} else {
						//保存成功
						res.status(200).json({
							code: 3,
							message: '注册成功'
						})
					}
				})

			}

		})

	}

})

/*----------------------------登录--------------------------------------------*/

app.post('/user/login', function(req, res) {
	//根据req.body.petname 去users文件夹中匹配
	var fileName = 'users/' + req.body.petname + '.txt'
	//查看users文件夹中是否有该用户
	fs.exists(fileName, function(exi) {
		if(exi) {
			//文件存在
			//读取fileName 路径的文件，进行密码的比较
			fs.readFile(fileName, function(err, data) {
				if(err) {
					//系统错误，读取失败
					res.status(200).json({
						code: 1,
						message: ' 系统错误，读取文件失败'
					})
				} else {
					//读取成功，进行密码比对
					var user = JSON.parse(data)
					if(req.body.password == user.password) {
						//登陆成功
						//设置应用发起http请求时提交的cookie值，调用此接口
						//所有的请求多会生效
						//petname设置到cookie里面去（把它储存到当前网页内
						//	1.有利于下次登陆，2.保存用户信息	）
						var expires = new Date()
						expires.setMonth(expires.getMonth() + 1)
						res.cookie('petname', req.body.petname, { expires })
						//登录成功
						res.status(200).json({
							code: 3,
							message: ' 登录成功'
						})

					} else {
						//密码错误
						res.status(200).json({
							code: 2,
							message: ' 密码错误'
						})
					}
				}
			})

		} else {
			//文件不存在，
			res.status(200).json({
				code: 0,
				message: '用户不存在'

			})
		}

	})

})

/*-----------------------提问----------------------------------------*/
app.post('/question/ask', function(req, res) {

	//判断有没有在cookie中把我们的petname传递过来
	if(!req.cookies.petname) {
		//比如：确实登录了，但是某些清除垃圾的软件会把储存的 cookie清除掉
		//更有可能你自己把cookie清楚了（或者时间戳到了）
		res.status(200).json({
			code: 0,
			message: '登录异常，请重新登录'
		})
		return;
	}
	//判断储存提问的文件夹是否存在
	fs.exists('questions', function(exi) {
		if(exi) {
			//文件存在
			writeFile()
		} else {
			//文件不存在，需要创建
			fs.mkdir('questions', function(err) {
				if(err) {
					//文件创建失败
					res.status(200).json({
						code: 1,
						message: '系统创建失败'
					})
				} else {
					//文件创建成功，（写入文件）
					writeFile()
				}
			})
		}
	})
	//封装一个写入问题的方法
	function writeFile() {

		//生成提问问题的文件名
		var date = new Date()
		var fileName = 'questions/' + date.getTime() + '.txt'
		//生成储存信息
		req.body.petname = req.cookies.petname;
		req.body.ip = req.ip
		req.body.time = date
		//写入文件
		fs.writeFile(fileName, JSON.stringify(req.body), function(err) {
			if(err) {
				//写入失败
				res.status(200).json({
					code: 2,
					message: '系统错误，写入失败'
				})
			} else {
				//写入成功
				res.status(200).json({
					code: 3,
					message: '提交问题成功'
				})
			}

		})

	}

})

/*-----------------------------展示内容---------------------------------*/
app.get('/question/all', function(req, res) {
	//返回所有文件
		fs.readdir('questions',function(err,files){
			if(err){
				//读取文件失败
				res.status(200).json({code:0,message:'失败'})
			}else{
				//读取文件成功
				//数组反序，目的：让最新的问题排在最前面 files 是目录的名称
				files =files.reverse()
				//创建一个数组容器，存放所有是问题对象
				var questions =[]
				for(var i=0; i<files.length;i++){
					var file =files[i]
					//拼接文件的 路径
					var	filePath  ='questions/' + file
					//readFile:异步读取文件的方法，可能导致的结果是
					//还么有读物完成就去res 了，没有数据返回
					//readFileSync  ：同步读取文件
					var data =fs.readFileSync(filePath)
					//把字符串转成json对象，存放到数组
					var obj =JSON.parse(data)
					questions.push(obj)
					
				}
				res.status(200).json(questions)
			}
			
			
			
			})
		})

			//监听端口号
			app.listen(3000, function() {
				console.log('服务器启动....')

			})